package com.xiaomitest;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

// 集合合并
public class MergeSet {
    public static void main(String[] args) throws IOException {
        // Scanner sc = new Scanner(System.in);
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        int k = n;// k为合并后的集合个数
        int max = 0; // 最大集合的元素个数
        int total = 20000000;// 超过32位表示的最大数
        int[] b = new int[n + 1];
        int[] c = new int[total];
        int[] a = new int[n + 1];
        for (int i = 1; i <= n ; i++) {
            // 每行读入的数字存入数组
            String[] sp = br.readLine().split(" ");
            for (int j = 0; j < sp.length; j++) {
                // 得到集合中的每一个元素
                int pa = Integer.parseInt(sp[j]);
                // c[pa] 表示pa 的上级（所属的集合）
                if(c[pa] == 0){
                    // 当前数组的数若无上级 就在当前集合i中
                    c[pa] = i;
                    // a[i]表示当前i集合的元素个数
                    ++a[i];
                    max = Math.max(max,a[i]);
                }else{
                    // 得到当前元素的所属集合（上级）为t集合
                    int t = c[pa];
                    // pa 这个数既在i 也在 t 集合中
                    c[pa] = i;
                    while (b[t] != 0){
                        if(t == b[t]){
                            break;
                        }
                        // 路径压缩算法
                        int tt = t;
                        // 得到原来的上级 改为t
                        t = b[t];
                        // 赋值当前的上级为i
                        b[tt] = i;
                    }
                    if(t != i){
                        a[i] += a[t];
                        max = Math.max(max,a[i]);
                        --k;
                        b[t] = i;

                    }
                }
            }
        }
        System.out.println(k);
        System.out.println(max);
        br.close();
    }
}


